Se utilizaron series de temperatura máxima (TX) de 53 estaciones meteorológicas del Estado de Río de Janeiro, proporcionadas por el Instituto Nacional de Meteorología de Brasil (INMET).
Preprocesamiento
Para garantizar la calidad de los datos, también se recogieron las temperaturas mínimas diarias, lo que permitió sustituir los valores de TX inferiores al mínimo diario por códigos de datos que faltaban.
El conjunto de datos contenía un número considerable de datos faltantes. Por lo tanto, para este estudio, seleccionamos estaciones con menos del 15% de datos faltantes desde el 1 de enero de 1971 hasta el 20 de marzo de 2024, asegurándonos de que su cobertura incluye los últimos siete meses de este periodo (desde septiembre de 2023 hasta marzo de 2024) con menos del 15% de datos faltantes también. En total, cinco estaciones cumplían estos criterios.
Una vez identificadas las estaciones meteorológicas, rellenamos los huecos de sus series temporales TX utilizando la estación más similar.
Se accedió a los datos de elevación a través de Amazon Web Services Open Data Terrain Tiles utilizando el paquete elevatr R (Hollister et al., 2023).
---
title: "Temperatura Río de Janeiro"
author: "S. Collazo"
date: "`r Sys.Date()`"
output:
flexdashboard::flex_dashboard:
theme: yeti
source_code: embed
logo: logos/rio1.jpg
favicon: logos/ucm_favicon.png
social: [ "twitter", "instagram", "menu" ]
navbar:
- { title: "Datasets", href: "https://bdmep.inmet.gov.br/#", align: left }
---
```{r setup, include=FALSE}
library(flexdashboard)
library(readr)
library(readxl)
library(dplyr)
library(ggplot2)
library(DT)
library(plotly)
library(raster)
library(rgdal)
library(sf)
library(ggspatial)
library(cowplot)
library(rnaturalearth) # Para obtener los datos de los países vecinos
library(elevatr)
library(tidyverse)
library(lubridate)
library(trend)
ubic <- read_xlsx("datos/ubic.xlsx")
df <- read_csv2("datos/tx7124_comp.csv")
df$fecha <- as.Date(df$fecha, format = "%d/%m/%Y")
```
# Datos {data-icon=fa-database}
## Columna 1 {data-width=450}
### Tabla de datos
```{r}
# Crear una tabla interactiva con DT
tabla_interactiva <- datatable(df, options = list( pageLength = 50))
tabla_interactiva
```
## Columna 2 {data-width=550}
### Recolección de datos {data-height=350}
Se utilizaron series de temperatura máxima (TX) de 53 estaciones meteorológicas del Estado de Río de Janeiro, proporcionadas por el Instituto Nacional de Meteorología de Brasil (INMET).
**Preprocesamiento**
1. Para garantizar la calidad de los datos, también se recogieron las temperaturas mínimas diarias, lo que permitió sustituir los valores de TX inferiores al mínimo diario por códigos de datos que faltaban.
2. El conjunto de datos contenía un número considerable de datos faltantes. Por lo tanto, para este estudio, seleccionamos estaciones con menos del 15% de datos faltantes desde el 1 de enero de 1971 hasta el 20 de marzo de 2024, asegurándonos de que su cobertura incluye los últimos siete meses de este periodo (desde septiembre de 2023 hasta marzo de 2024) con menos del 15% de datos faltantes también. En total, cinco estaciones cumplían estos criterios.
3. Una vez identificadas las estaciones meteorológicas, rellenamos los huecos de sus series temporales TX utilizando la estación más similar.
### Ubicación de las estaciones {data-height=600}
```{r fig.width=10, fig.height=5}
# Define el área de interés (AOI) para Río de Janeiro
# Coordenadas aproximadas del estado de Río de Janeiro
aoi <- st_as_sf(data.frame(
x = c(-46, -40.9),
y = c(-23.4, -20.6)
), coords = c("x", "y"), crs = 4326)
# Obtener datos de elevación para el AOI
elev_data <- get_elev_raster(locations = aoi, z = 10, clip = "locations")
# Descargar y cargar shapefile del estado de Río de Janeiro
# Asegúrate de tener el shapefile descargado en tu directorio de trabajo
# Cargar el shapefile de Brasil
brasil_shapefile <- st_read("datos/gadm41_BRA_1.shp", quiet = TRUE)
# Filtrar el shapefile para obtener solo el estado de Río de Janeiro
rio_shapefile <- brasil_shapefile[which(brasil_shapefile$NAME_1 == "Rio de Janeiro"),]
# Recortar el raster de elevación usando el shapefile de Río de Janeiro
rio_elev <- crop(elev_data, rio_shapefile)
rio_elev <- mask(rio_elev, rio_shapefile)
# Convertir el raster a un data frame para ggplot2
rio_elev_df <- as.data.frame(rio_elev, xy = TRUE)
names(rio_elev_df)[3] <- "elevation"
ID<-c('83007','83695','83738','83718','83698')
nome<-c('Alto da \n Boa Vista', 'Itaperuna', 'Campos', 'Cordeiro', 'Resende')
direction<-c('below', 'below','above','above','above')
ids<-which(ubic$id %in% ID)
ubi<-cbind(ubic[ids,],nome, direction)
# Crear una columna 'nudge_y' en función de 'direction'
nudge_y <- ifelse(ubi$direction == "above", 0.1, -0.125)
ubi2<-ubic[-ids,]
# Crear el mapa con ggplot2
rio<-ggplot() +
geom_raster(data = rio_elev_df, aes(x = x, y = y, fill = elevation)) +
scale_fill_gradientn(colours = terrain.colors(10), limits = c(0,2000),na.value = 'white') +
geom_sf(data = rio_shapefile, fill = NA, color = "black", size = 0.5) +
geom_point(data = ubi, aes(Lon, Lat), color = 'black', size = 2.5) +
geom_point(data = ubi2, aes(Lon, Lat), color = 'blue', size = 0.7) +
geom_text(data = ubi, aes(x = Lon, y = Lat, label = nome), nudge_y = nudge_y,
size = 3, fontface = 'bold')+
xlim(-44.9,-40.8)+
coord_sf() +
labs(
title = "",
fill = "Elevation (m)",
x = "Longitude",
y = "Latitude"
) +
theme_bw() +
theme(legend.key.height = unit(1.2, "cm"),
plot.title = element_text(hjust = 0.0),
axis.text = element_text(size = 8)
) +
annotation_scale(location = "br", width_hint = 0.2) +
annotation_north_arrow(location = "tl", which_north = "true",
style = north_arrow_fancy_orienteering)
# Obtener los datos del mundo (países)
world_shapefile <- ne_countries(scale = "medium", returnclass = "sf")
# Crear el mapa de Brasil resaltando el estado de Río de Janeiro y agregando fronteras
brasil_map <- ggplot() +
geom_sf(data = world_shapefile, fill = "gray99", color = "black", size = 0.2) + # Fronteras de países vecinos
geom_sf(data = brasil_shapefile, fill = "gray30", color = "black", size = 0.2) + # Fronteras de Brasil
geom_sf(data = rio_shapefile, fill = "magenta", color = "black", size = 0.5) + # Resaltar el estado de Rio
coord_sf(xlim = c(-73, -32), ylim = c(-33, 5)) + # Coordenadas para ajustar el mapa de Brasil
theme_void() + # Sin ejes ni etiquetas
theme(
panel.background = element_rect(fill = "lightblue"), # Colorear el océano
plot.background = element_rect(fill = "lightblue") # Asegurarse que el fondo del gráfico también sea celeste
) +
# Añadir un marco negro alrededor del inset usando geom_rect
annotate("rect", xmin = -75, xmax = -30, ymin = -35, ymax = 7, color = "black", fill = NA, linewidth = 1)
final_map <- ggdraw() +
draw_plot(rio) + # Mapa principal
draw_plot(brasil_map, x = 0.17, y = 0.61, width = 0.25, height = 0.25) # Inset en la esquina inferior derecha
final_map
```
### Columna de texto sin título {data-height=50 .no-title}
<div style="font-size: 10px;">
Se accedió a los datos de elevación a través de Amazon Web Services Open Data Terrain Tiles utilizando el paquete elevatr R (Hollister et al., 2023).
</div>
# Extremos {data-icon=fa-temperature-arrow-up}
## Row {data-height=300}
### PDF de TX
```{r}
# Reacomodo la tabla con una fila de temperaturas y otra de estaciones
df_long <- df %>%
pivot_longer(
cols = -fecha, # todas las columnas menos "fecha"
names_to = "estacion",
values_to = "temperatura"
)
g1 <- ggplot(df_long, aes(x = temperatura, color = estacion, fill = estacion)) +
geom_density(alpha = 0.3) +
labs(title = "Distribución de Temperaturas por Estación",
x = "Temperatura (°C)", y = "Densidad") +
theme_minimal()
g2 <- ggplotly(g1)
g2
```
## Máximo anual de TX {data-height=700, .tabset}
```{r}
# Agrego columna con el año
df$anio <- year(df$fecha)
```
### Alto da Boa Vista
```{r}
# Estimo la TX máxima anual
df_alto <- df %>%
group_by(anio) %>%
summarise(TXx = max(`Alto da Boa Vista`))
#Ploteo serie temporal y tendencia
# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_alto$TXx)
slope <- sens.slope(df_alto$TXx)$estimates
# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")
# Graficar la serie temporal con personalización
gg <- ggplot(df_alto, aes(x = anio, y = TXx)) +
geom_line(color = "blue", linewidth = 1) + # Línea de la serie temporal
geom_point(color = "blue", size = 2.5) + # Puntos en la serie temporal
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = " ",
x = "Year",
y = "TXx [ºC]") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))+
annotate("text", x = 1982, y = max(df_alto$TXx),
label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")
ggout <- ggplotly(gg)
ggout
```
### Itaperuna
```{r}
df_ita <- df %>%
group_by(anio) %>%
summarise(TXx = max(Itaperuna))
#Ploteo serie temporal y tendencia
# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_ita$TXx)
slope <- sens.slope(df_ita$TXx)$estimates
# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")
# Graficar la serie temporal con personalización
gg <- ggplot(df_ita, aes(x = anio, y = TXx)) +
geom_line(color = "blue", linewidth = 1) + # Línea de la serie temporal
geom_point(color = "blue", size = 2.5) + # Puntos en la serie temporal
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = "Temperatura máxima anual",
x = "Year",
y = "TXx [ºC]") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))+
annotate("text", x = 1982, y = max(df_ita$TXx),
label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")
ggout <- ggplotly(gg)
ggout
```
### Campos
```{r}
df_campos <- df %>%
group_by(anio) %>%
summarise(TXx = max(Campos))
#Ploteo serie temporal y tendencia
# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_campos$TXx)
slope <- sens.slope(df_campos$TXx)$estimates
# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")
# Graficar la serie temporal con personalización
gg <- ggplot(df_campos, aes(x = anio, y = TXx)) +
geom_line(color = "blue", linewidth = 1) + # Línea de la serie temporal
geom_point(color = "blue", size = 2.5) + # Puntos en la serie temporal
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = " ",
x = "Year",
y = "TXx [ºC]") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))+
annotate("text", x = 1982, y = max(df_campos$TXx),
label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")
ggout <- ggplotly(gg)
ggout
```
### Cordeiro
```{r}
df_cordeiro <- df %>%
group_by(anio) %>%
summarise(TXx = max(Cordeiro))
#Ploteo serie temporal y tendencia
# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_cordeiro$TXx)
slope <- sens.slope(df_cordeiro$TXx)$estimates
# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")
# Graficar la serie temporal con personalización
gg <- ggplot(df_cordeiro, aes(x = anio, y = TXx)) +
geom_line(color = "blue", linewidth = 1) + # Línea de la serie temporal
geom_point(color = "blue", size = 2.5) + # Puntos en la serie temporal
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = " ",
x = "Year",
y = "TXx [ºC]") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))+
annotate("text", x = 1982, y = max(df_cordeiro$TXx),
label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")
ggout <- ggplotly(gg)
ggout
```
### Resende
```{r}
df_res <- df %>%
group_by(anio) %>%
summarise(TXx = max(Resende))
#Ploteo serie temporal y tendencia
# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_res$TXx)
slope <- sens.slope(df_res$TXx)$estimates
# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")
# Graficar la serie temporal con personalización
gg <- ggplot(df_res, aes(x = anio, y = TXx)) +
geom_line(color = "blue", linewidth = 1) + # Línea de la serie temporal
geom_point(color = "blue", size = 2.5) + # Puntos en la serie temporal
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = " ",
x = "Year",
y = "TXx [ºC]") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))+
annotate("text", x = 1982, y = max(df_res$TXx),
label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")
ggout <- ggplotly(gg)
ggout
```